package com.lin.java.tool.send.sms;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Validator;
import com.lin.java.tool.send.SendStrategy;
import com.lin.java.tool.send.enums.SendEnum;
import com.lin.java.tool.send.ex.CustomSendException;
import com.lin.java.tool.send.model.Sms;
import com.lin.java.tool.send.model.dto.SmsDTO;

import java.util.List;
import java.util.StringJoiner;

/**
 * @author linjiang
 * @date 2024/8/14
 * 短信发送服务（策略模式 + 模板方法模式  + 工厂模式 ）
 * 1.创建短信工厂
 * 2.从工厂中获取短信服务
 * 3.调用短信服务发送短信
 */
public abstract class SmsStrategy<T extends SmsDTO> implements SendStrategy<T> {

    /**
     * 短信参数配置
     */
    protected Sms sms;

    @Override
    public Boolean send(T send) {
        handleParam(send);
        return sendSms(send);
    }

    private void handleParam(SmsDTO send) {
        checkPhoneNum(send.getPhoneNums());
    }

    /**
     * 校验手机号
     *
     * @param phoneNums
     */
    private void checkPhoneNum(List<String> phoneNums) {
        if (CollectionUtil.isEmpty(phoneNums)) {
            throw new CustomSendException(SendEnum.SEND_PHONE_NUM_ZERO);
        }

        if (phoneNums.size() > 100) {
            throw new CustomSendException(SendEnum.SEND_PHONE_NUM_HUNDRED);
        }

        // 校验所有的手机号是否是正确格式
        StringJoiner joiner = new StringJoiner(",");
        boolean match = phoneNums.stream().allMatch(var -> {
            boolean bool = Validator.isMobile(var);
            if (!bool) {
                joiner.add(var);
            }
            return bool;
        });
        if (!match) {
            throw new CustomSendException(SendEnum.SEND_FAIl.getCode(), String.format("手机号格式错误：【%s】", joiner));
        }
    }

    /**
     * 发送短信
     *
     * @return
     */
    protected abstract Boolean sendSms(T t);
}
